package com.controller;
import com.bean.Book;
import com.common.Result;
import com.service.BookService;
import com.utils.PageInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

@RestController
@RequestMapping("/books")
public class BookController {
    @Autowired
    private BookService bookService;

    /**
     * 根据书籍 ID 查询书籍信息的接口
     * @param id 书籍的唯一标识
     * @return 封装了查询结果的通用结果对象，包含状态码、消息和数据
     */
    @GetMapping("/{id}")
    public Result<Book> getBookById(@PathVariable Integer id) {
        // 调用 Service 层的方法查询书籍信息
        Book book = bookService.getBookById(id);
        if (book != null) {
            // 如果查询到书籍信息，返回成功结果
            return Result.success(book);
        } else {
            // 如果未查询到书籍信息，返回失败结果
            return Result.fail("书籍不存在");
        }
    }

    /**
     * 根据关键字进行分页模糊查询书籍信息的接口
     * @param keyword 用于模糊查询的关键字
     * @param pageNum 当前页码
     * @param pageSize 每页显示的记录数量
     * @return 封装了查询结果的通用结果对象，包含状态码、消息和分页后的书籍列表
     */
    @GetMapping
    public Result<PageInfo<Book>> getBooksByKeyword(@RequestParam(required = false) String keyword,
                                                    @RequestParam(defaultValue = "1") int pageNum,
                                                    @RequestParam(defaultValue = "10") int pageSize) {
        // 调用 Service 层的方法进行分页模糊查询
        PageInfo<Book> pageInfo = bookService.getBooksByKeyword(keyword, pageNum, pageSize);
        // 返回成功结果
        return Result.success(pageInfo);
    }

    /**
     * 根据类别 ID 进行分页查询书籍信息的接口
     * @param categoryId 书籍所属类别的唯一标识
     * @param pageNum 当前页码
     * @param pageSize 每页显示的记录数量
     * @return 封装了查询结果的通用结果对象，包含状态码、消息和分页后的该类别下的书籍列表
     */
    @GetMapping("/category/{categoryId}")
    public Result<PageInfo<Book>> getBooksByCategoryId(@PathVariable Integer categoryId,
                                                       @RequestParam(defaultValue = "1") int pageNum,
                                                       @RequestParam(defaultValue = "10") int pageSize) {
        // 调用 Service 层的方法根据类别 ID 进行分页查询
        PageInfo<Book> pageInfo = bookService.getBooksByCategoryId(categoryId, pageNum, pageSize);
        // 返回成功结果
        return Result.success(pageInfo);
    }

    /**
     * 插入一本新的书籍信息的接口
     * @param book 包含书籍详细信息的对象
     * @return 封装了插入结果的通用结果对象，包含状态码、消息和插入是否成功的标志
     */
    @PostMapping
    public Result<Boolean> insertBook(@RequestBody Book book) {
        // 调用 Service 层的方法插入书籍信息
        boolean result = bookService.insertBook(book);
        if (result) {
            // 如果插入成功，返回成功结果
            return Result.success(true);
        } else {
            // 如果插入失败，返回失败结果
            return Result.fail("插入书籍失败");
        }
    }

    /**
     * 根据书籍 ID 更新书籍的相关信息的接口
     * @param book 包含要更新的书籍信息的对象，其中 ID 用于定位要更新的记录
     * @return 封装了更新结果的通用结果对象，包含状态码、消息和更新是否成功的标志
     */
    @PutMapping
    public Result<Boolean> updateBook(@RequestBody Book book) {
        // 调用 Service 层的方法更新书籍信息
        boolean result = bookService.updateBook(book);
        if (result) {
            // 如果更新成功，返回成功结果
            return Result.success(true);
        } else {
            // 如果更新失败，返回失败结果
            return Result.fail("更新书籍失败，书籍可能不存在");
        }
    }

    /**
     * 根据书籍 ID 从数据库中删除对应的书籍信息的接口
     * @param id 要删除的书籍的唯一标识
     * @return 封装了删除结果的通用结果对象，包含状态码、消息和删除是否成功的标志
     */
    @DeleteMapping("/{id}")
    public Result<Boolean> deleteBookById(@PathVariable Integer id) {
        // 调用 Service 层的方法删除书籍信息
        boolean result = bookService.deleteBookById(id);
        if (result) {
            // 如果删除成功，返回成功结果
            return Result.success(true);
        } else {
            // 如果删除失败，返回失败结果
            return Result.fail("删除书籍失败，书籍可能不存在");
        }
    }
}